/**
 * 文件名：@AbstractFormatConverter.java <br/>
 * 包名：cn.efunbox.afw.core.converter <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.converter;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import cn.efunbox.afw.core.exception.ConversionException;

/**
 * 类名：AbstractFormatConverter  <br />
 *
 * 功能：具有格式的类型转换器，如日期，数字等
 *
 * @author xtwin <br />
 * 创建时间：2015年12月4日 下午4:38:45  <br />
 * @version 2015年12月4日
 */
public abstract class AbstractFormatConverter<T> extends AbstractConverter {
	
	// 日志记录器
	private static final Log logger = LogFactory.getLog(AbstractFormatConverter.class);
	
	// 格式
	protected String format;
	
	/**
	 * 构造方法
	 */
	public AbstractFormatConverter() {
	}
	
	/**
	 * 构造方法
	 */
	public AbstractFormatConverter(String format) {
		this.format = format;
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2015年12月4日 下午4:38:58<br/>
	 * 
	 * @param original
	 * @param config
	 * @return
	 * @throws Exception <br/>
	 * @see cn.efunbox.afw.core.converter.AbstractConverter#doConvert(java.lang.Object, java.lang.Object)
	 */
	@Override
	protected Object doConvert(Object original, Object config) throws Exception {
		String _format = null != config ? (String) config : null;
		if (null == _format) {
			_format = format;
		}
		
		try {
			return parse(original, _format, config);
		} catch (Exception e) {
			logger.error("format parse error!", e);
			
			// 格式非法
			throw new ConversionException("parse.by.format.failer", new Object[] { _format });
		}
	}
	
	/**
	 * 
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2015年12月4日 下午4:39:37 <br/>
	 */
	protected abstract T parse(Object original, String format, Object config) throws Exception;

	/**
	 * @version 2015年12月4日-下午4:42:15
	 */
	public void setFormat(String format) {
		this.format = format;
	}
}
